home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / Meshwriter_lib / Library / source / LibInit.c < prev    next >
C/C++ Source or Header  |  1999-12-03  |  5KB  |  157 lines

  1. /*
  2. **      $VER: LibInit.c 0.2 (28.03.99)
  3. **
  4. **      Library initializers and functions to be called by StartUp.c
  5. **
  6. **      (C) Copyright 1996-98 Andreas R. Kleinert
  7. **      All Rights Reserved.
  8. */
  9.  
  10. #define __USE_SYSBASE        // perhaps only recognized by SAS/C
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/libraries.h>
  15. #include <exec/execbase.h>
  16. #include <exec/resident.h>
  17. #include <exec/initializers.h>
  18.  
  19. #ifdef __MAXON__
  20. #include <clib/exec_protos.h>
  21. #else
  22. #include <proto/exec.h>
  23. #endif
  24. #include "compiler.h"
  25.  
  26. #ifdef __GNUC__
  27. #include "../include/meshwriter/meshwriterbase.h"
  28. #elif VBCC
  29. #include "include/meshwriter/meshwriterbase.h"
  30. #else
  31. #include "/include/meshwriter/meshwriterbase.h"
  32. #endif
  33.  
  34. ULONG __saveds __stdargs L_OpenLibs(struct MeshWriterBase *MeshWriterBase);
  35. void  __saveds __stdargs L_CloseLibs(void);
  36.  
  37. struct ExecBase      *SysBase       = NULL;
  38. struct UtilityBase   *UtilityBase   = NULL;
  39.  
  40. #define VERSION  00
  41. #define REVISION 01
  42.  
  43. char __aligned MwLibName [] = "meshwriter.library";
  44. char __aligned MwLibID   [] = "$VER:meshwriter 0.2 (28.3.99)";
  45. char __aligned Copyright [] = "(C)opyright 1998-99 by Stephan Bielmann. All rights reserved.";
  46.  
  47.  
  48. /* ----------------------------------------------------------------------------------------
  49.    ! ROMTag and Library inilitalization structure:
  50.    !
  51.    ! Below you find the ROMTag, which is the most important "magic" part of a library
  52.    ! (as for any other resident module). You should not need to modify any of the
  53.    ! structures directly, since all the data is referenced from constants from somewhere else.
  54.    !
  55.    ! You may place the ROMTag directly after the LibStart (-> StartUp.c) function as well.
  56.    !
  57.    ! Note, that the data initialization structure may be somewhat redundant - it's
  58.    ! for demonstration purposes.
  59.    !
  60.    ! EndResident can be placed somewhere else - but it must follow the ROMTag and
  61.    ! it must not be placed in a different SECTION.
  62.    ---------------------------------------------------------------------------------------- */
  63.  
  64. extern ULONG InitTab[];
  65. extern APTR EndResident; /* below */
  66.  
  67. struct Resident __aligned ROMTag =     /* do not change */
  68. {
  69.  RTC_MATCHWORD,
  70.  &ROMTag,
  71.  &EndResident,
  72.  RTF_AUTOINIT,
  73.  VERSION,
  74.  NT_LIBRARY,
  75.  0,
  76.  &MwLibName[0],
  77.  &MwLibID[0],
  78.  &InitTab[0]
  79. };
  80.  
  81. APTR EndResident;
  82.  
  83. struct MyDataInit                      /* do not change */
  84. {
  85.  UWORD ln_Type_Init;      UWORD ln_Type_Offset;      UWORD ln_Type_Content;
  86.  UBYTE ln_Name_Init;      UBYTE ln_Name_Offset;      ULONG ln_Name_Content;
  87.  UWORD lib_Flags_Init;    UWORD lib_Flags_Offset;    UWORD lib_Flags_Content;
  88.  UWORD lib_Version_Init;  UWORD lib_Version_Offset;  UWORD lib_Version_Content;
  89.  UWORD lib_Revision_Init; UWORD lib_Revision_Offset; UWORD lib_Revision_Content;
  90.  UBYTE lib_IdString_Init; UBYTE lib_IdString_Offset; ULONG lib_IdString_Content;
  91.  ULONG ENDMARK;
  92. } DataTab =
  93. #ifdef VBCC
  94. {
  95.         0xe000,8,NT_LIBRARY,
  96.         0x0080,10,(ULONG) &MwLibName[0],
  97.         0xe000,LIBF_SUMUSED|LIBF_CHANGED,
  98.         0xd000,20,VERSION,
  99.         0xd000,22,REVISION,
  100.         0x80,24,(ULONG) &MwLibID[0],
  101.         (ULONG) 0
  102. };
  103. #else
  104. {
  105.  INITBYTE(OFFSET(Node,         ln_Type),      NT_LIBRARY),
  106.  0x80, (UBYTE) OFFSET(Node,    ln_Name),      (ULONG) &MwLibName[0],
  107.  INITBYTE(OFFSET(Library,      lib_Flags),    LIBF_SUMUSED|LIBF_CHANGED),
  108.  INITWORD(OFFSET(Library,      lib_Version),  VERSION),
  109.  INITWORD(OFFSET(Library,      lib_Revision), REVISION),
  110.  0x80, (UBYTE) OFFSET(Library, lib_IdString), (ULONG) &MwLibID[0],
  111.  (ULONG) 0
  112. };
  113. #endif
  114.  
  115.  
  116. /* ----------------------------------------------------------------------------------------
  117.    ! L_OpenLibs:
  118.    !
  119.    ! Since this one is called by InitLib, libraries not shareable between Processes or
  120.    ! libraries messing with RamLib (deadlock and crash) may not be opened here.
  121.    !
  122.    ! You may bypass this by calling this function fromout LibOpen, but then you will
  123.    ! have to a) protect it by a semaphore and b) make sure, that libraries are only
  124.    ! opened once (when using global library bases).
  125.    ---------------------------------------------------------------------------------------- */
  126.  
  127. ULONG __saveds __stdargs L_OpenLibs(struct MeshWriterBase *MeshWriterBase)
  128. {
  129.  SysBase = (*((struct ExecBase **) 4));
  130.  
  131.  UtilityBase = (struct UtilityBase *) OpenLibrary("utility.library", 37);
  132.  if(!UtilityBase) return(FALSE);
  133.  
  134.  MeshWriterBase->mwb_UtilityBase = UtilityBase;
  135.  
  136.  MeshWriterBase->mwb_SysBase     = SysBase;
  137.  
  138.  return(TRUE);
  139. }
  140.  
  141. /* ----------------------------------------------------------------------------------------
  142.    ! L_CloseLibs:
  143.    !
  144.    ! This one by default is called by ExpungeLib, which only can take place once
  145.    ! and thus per definition is single-threaded.
  146.    !
  147.    ! When calling this fromout LibClose instead, you will have to protect it by a
  148.    ! semaphore, since you don't know whether a given CloseLibrary(foobase) may cause a Wait().
  149.    ! Additionally, there should be protection, that a library won't be closed twice.
  150.    ---------------------------------------------------------------------------------------- */
  151.  
  152. void __saveds __stdargs L_CloseLibs(void)
  153. {
  154.  if(UtilityBase) CloseLibrary((struct Library *) UtilityBase);
  155. }
  156.  
  157.